package com.xhx.util;

import java.io.Serializable;
import java.util.List;
import java.util.function.Function;

import com.github.pagehelper.Page;
import com.xhx.vo.PageInfoParam;
import com.xhx.vo.PageInfoResult;

/**
 * 分页转换器
 * 
 * @author xhx
 */
public class PageConvertUtil {
	private PageConvertUtil() {
	}

	/**
	 * 转换page结果<br>
	 * 把PageHepler结果转换分页结果
	 *
	 * @param <T>
	 * @param page 由PageHepler返回
	 * @param list 当前页里面的数据集合
	 * @return
	 */
	public static <T extends Serializable> PageInfoResult<T> build(Page<?> page, List<T> list) {
		PageInfoResult<T> p = new PageInfoResult<>();
		p.setList(list);
		p.setCount(page.getTotal());
		p.setPageNo(page.getPageNum());
		p.setPageSize(page.getPageSize());
		p.setPages(page.getPages());
		return p;
	}

	/**
	 * 转换page结果<br>
	 * 把PageHepler结果转换分页结果
	 *
	 * @param <T>
	 * @param page 由PageHepler返回
	 * @return
	 */
	public static <T extends Serializable> PageInfoResult<T> build(Page<T> page) {
		return build(page, page);
	}

	/**
	 * 转换page结果<br>
	 * 把数据集合转换分页结果
	 *
	 * @param <T>
	 * @param list 全量数据集合
	 * @return
	 */
	public static <T extends Serializable> PageInfoResult<T> build(List<T> list) {
		PageInfoResult<T> p = new PageInfoResult<>();
		p.setList(list);
		p.setCount(list.size());
		p.setPageNo(1);
		p.setPageSize(p.getCount());
		p.setPages(1);
		return p;
	}

	/**
	 * 转换page结果<br>
	 * 逻辑分页
	 * 
	 * @param <T>
	 * @param pageNo   页条数
	 * @param pageSize 页条数
	 * @param list     全量数据集合
	 * @return
	 */
	public static <T extends Serializable> PageInfoResult<T> build(int pageNo, int pageSize, List<T> list) {
		return PageInfoResult.customResult(pageNo, pageSize, list);
	}

	/**
	 * 转换page结果<br>
	 * 无数据
	 * 
	 * @param <T>
	 * @param pageNo   页条数
	 * @param pageSize 页条数
	 * @return
	 */
	public static <T extends Serializable> PageInfoResult<T> buildEmpty(int pageNo, int pageSize) {
		return PageInfoResult.customResult(pageNo, pageSize, null);
	}

	/**
	 * 转换page结果<br>
	 * 无数据
	 * 
	 * @param <T>
	 * @param param 分页参数
	 * @return
	 */
	public static <T extends Serializable> PageInfoResult<T> buildEmpty(PageInfoParam<?> param) {
		return PageInfoResult.customResult(param.getPageNo(), param.getPageSize(), null);
	}

	/**
	 * 转换page结果<br>
	 * 
	 * @param <E>
	 * @param <R>
	 * @param page     原分页结果
	 * @param function 转换函数
	 * @return
	 */
	public static <E extends Serializable, R extends Serializable> PageInfoResult<R> build(PageInfoResult<E> page,
			Function<E, R> function) {
		return PageInfoResult.build(page, function);
	}

}
